package lucava.metamodel.java.visitor;

import lucava.metamodel.java.Annotations;
import lucava.metamodel.java.Attribute;
import lucava.metamodel.java.Comments;
import lucava.metamodel.java.MetaClasse;
import lucava.metamodel.java.MetaInterface;
import lucava.metamodel.java.MetaModel;
import lucava.metamodel.java.MetaPackage;
import lucava.metamodel.java.Methode;
import lucava.metamodel.java.MethodeBody;
import lucava.metamodel.java.MethodeSignature;
import lucava.metamodel.java.Modifier;
import lucava.metamodel.java.Parameter;
import lucava.metamodel.java.Variable;
import lucava.metamodel.java.Visibility;
import lucava.metamodel.java.type.MetaParametricType;
import lucava.metamodel.java.type.MetaType;

/**
 * Interface décrivant le comportement du visiteur de MetaModel Java.
 */
public interface IJavaMetaModelVisitor {

	/**
	 * Visite la visibilité d'un élément.
	 */
	void visitVisibility(Visibility aVisibility);

	/**
	 * Visite le type d'un élément.
	 */
	void visitType(MetaType aMetaType);

	/**
	 * Visite une Interface du MetaModel
	 */
	void visitInterface(MetaInterface aMetaInterface);

	/**
	 * Visite une Classe du MetaModel
	 */
	void visitClasse(MetaClasse aMetaClasse);

	/**
	 * Visite une Méthode du MetaModel
	 */
	void visitMethode(Methode aMetaMethode);

	/**
	 * Visite la signature d'une méthode du MetaModel
	 */
	void visitSignature(MethodeSignature aMetaSignature);

	/**
	 * Visite une Variable du MetaModel
	 */
	void visitVariable(Variable aVariable);

	/**
	 * Visite un type paramétrique du MetaModel
	 */
	void visitParametricType(MetaParametricType aMetaParametricType);

	/**
	 * Visite le MetaModel
	 */
	void visitMetaModel(MetaModel aMetaModel);

	/**
	 * Visite le modifier d'un élément du MetaModel
	 */
	void visitModifier(Modifier aModifier);

	/**
	 * Visite une annotation du MetaModel
	 */
	void visitAnnotations(Annotations anAnnotations);

	/**
	 * Visite une Paramètre du MetaModel
	 */
	void visitParameter(Parameter aParameter);

	/**
	 * Visite le corps d'une méthode du MetaModel
	 */
	void visitMethodeBody(MethodeBody aMethodeBody);

	/**
	 * Visite le commentaire d'un élément du MetaModel
	 */
	void visitComments(Comments aComments);

	/**
	 * Visite un Package du MetaModel
	 */
	void visitPackage(MetaPackage aPackage);

	/**
	 * Visite un Attribut du MetaModel
	 */
	void visitAttribute(Attribute anAttribute);

}
